// compile: g++ -o rvalue rvalue.cc -fno-elide-constructors -std=c++11
// run: ./rvalue
#include <iostream>

using namespace std;

void Test1() {
  int x = 0;
  int* p1 = &++x;
  // int* p2 = &x++; // 编译出错，x++为一个右值

  int& a = x;
  // int& aa = 0; // 编译出错，左值引用不能绑定右值
  const int& aaa = x;
  const int& aaaa = 0;
  // int&& b = x; // 编译出错，右值引用不能绑定左值
  int&& bb = 0;
}
class A {
 public:
  A() { cout << "A ctor" << endl; }
  ~A() { cout << "A dtor" << endl; }
  A(const A&) { cout << "A copy ctor" << endl; }
  A& operator=(const A&) {
    cout << "A copy assign" << endl;
    return *this;
  }

 private:
};
// 给gcc加上选项-fno-elide-constructors关闭返回值优化
A Make_A() {
  A a;
  return a;
}
void Test2() {
  // A a = Make_A();
  A&& a = Make_A();  // 比起上面一行代码少了一次拷贝构造
}
int main() {
  // Test1();
  Test2();
  return 0;
}
